package user

import (
	"fmt"
	"strconv"
	"strings"

	"github.com/gin-gonic/gin"
	"github.com/star-find-cloud/star-safe/pkg/logger"
	"github.com/star-find-cloud/star-safe/pkg/utils"
)

// Controller 用户控制器接口
type Controller interface {
	CreateUser(c *gin.Context)
	GetUserByID(c *gin.Context)
	GetUserByUsername(c *gin.Context)
	UpdateUser(c *gin.Context)
	DeleteUser(c *gin.Context)
	ListUsers(c *gin.Context)
	Login(c *gin.Context)
}

type userController struct {
	service Service
}

// NewController 创建用户控制器实例
func NewController(service Service) Controller {
	return &userController{
		service: service,
	}
}

// CreateUser 创建用户
func (ctrl *userController) CreateUser(c *gin.Context) {
	var req CreateUserRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		logger.MySQLLogger.Errorf("参数绑定失败: %v", err)
		utils.BadRequest(c, "请求参数错误")
		return
	}

	// 验证参数
	if err := validateCreateUserRequest(&req); err != nil {
		utils.BadRequest(c, err.Error())
		return
	}

	user, err := ctrl.service.CreateUser(c.Request.Context(), &req)
	if err != nil {
		if err.Error() == "用户名已存在" || err.Error() == "邮箱已存在" {
			utils.BadRequest(c, err.Error())
			return
		}
		logger.MySQLLogger.Errorf("创建用户失败: %v", err)
		utils.InternalError(c, err.Error())
		return
	}

	utils.Created(c, user)
}

// GetUserByID 根据ID获取用户
func (ctrl *userController) GetUserByID(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		utils.BadRequest(c, "无效的用户ID")
		return
	}

	user, err := ctrl.service.GetUserByID(c.Request.Context(), id)
	if err != nil {
		if err.Error() == "用户不存在" {
			utils.NotFound(c, "用户不存在")
			return
		}
		logger.MySQLLogger.Errorf("获取用户失败: %v", err)
		utils.InternalError(c, "获取用户失败")
		return
	}

	utils.Success(c, user)
}

// GetUserByUsername 根据用户名获取用户
func (ctrl *userController) GetUserByUsername(c *gin.Context) {
	username := c.Param("username")
	if username == "" {
		utils.BadRequest(c, "用户名不能为空")
		return
	}

	user, err := ctrl.service.GetUserByUsername(c.Request.Context(), username)
	if err != nil {
		if err.Error() == "用户不存在" {
			utils.NotFound(c, "用户不存在")
			return
		}
		logger.MySQLLogger.Errorf("获取用户失败: %v", err)
		utils.InternalError(c, "获取用户失败")
		return
	}

	utils.Success(c, user)
}

// UpdateUser 更新用户信息
func (ctrl *userController) UpdateUser(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		utils.BadRequest(c, "无效的用户ID")
		return
	}

	var req UpdateUserRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		logger.MySQLLogger.Errorf("参数绑定失败: %v", err)
		utils.BadRequest(c, "无效的请求参数")
		return
	}

	// 验证参数
	if err := validateUpdateUserRequest(&req); err != nil {
		utils.BadRequest(c, err.Error())
		return
	}

	err = ctrl.service.UpdateUser(c.Request.Context(), id, &req)
	if err != nil {
		if err.Error() == "用户不存在或已被删除" {
			utils.NotFound(c, "用户不存在")
			return
		}
		logger.MySQLLogger.Errorf("更新用户失败: %v", err)
		utils.InternalError(c, err.Error())
		return
	}

	utils.Success(c, nil)
}

// DeleteUser 删除用户
func (ctrl *userController) DeleteUser(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		utils.BadRequest(c, "无效的用户ID")
		return
	}

	err = ctrl.service.DeleteUser(c.Request.Context(), id)
	if err != nil {
		if err.Error() == "用户不存在或已被删除" {
			utils.NotFound(c, "用户不存在")
			return
		}
		logger.MySQLLogger.Errorf("删除用户失败: %v", err)
		utils.InternalError(c, err.Error())
		return
	}

	utils.Success(c, nil)
}

// ListUsers 分页获取用户列表
func (ctrl *userController) ListUsers(c *gin.Context) {
	page, err := strconv.Atoi(c.DefaultQuery("page", "1"))
	if err != nil || page < 1 {
		utils.BadRequest(c, "无效的分页参数")
		return
	}

	pageSize, err := strconv.Atoi(c.DefaultQuery("pageSize", "10"))
	if err != nil || pageSize < 1 || pageSize > 100 {
		utils.BadRequest(c, "无效的分页大小")
		return
	}

	users, total, err := ctrl.service.ListUsers(c.Request.Context(), page, pageSize)
	if err != nil {
		logger.MySQLLogger.Errorf("获取用户列表失败: %v", err)
		utils.InternalError(c, "获取用户列表失败")
		return
	}

	utils.Success(c, gin.H{
		"list":     users,
		"total":    total,
		"page":     page,
		"pageSize": pageSize,
		"pages":    (total + int64(pageSize) - 1) / int64(pageSize),
	})
}

// Login 用户登录
func (ctrl *userController) Login(c *gin.Context) {
	type LoginRequest struct {
		Username string `json:"username"`
		Password string `json:"password"`
	}

	var req LoginRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		logger.MySQLLogger.Errorf("参数绑定失败: %v", err)
		utils.BadRequest(c, "无效的请求参数")
		return
	}

	if req.Username == "" || req.Password == "" {
		utils.BadRequest(c, "用户名和密码不能为空")
		return
	}

	user, err := ctrl.service.VerifyPassword(c.Request.Context(), req.Username, req.Password)
	if err != nil {
		logger.MySQLLogger.Warnf("登录失败: %v", err)
		utils.Unauthorized(c, err.Error())
		return
	}

	// 这里可以生成JWT token
	utils.Success(c, gin.H{
		"user":  user,
		"token": "jwt_token_placeholder", // 实际项目中应该生成真实的JWT token
	})
}

// validateCreateUserRequest 验证创建用户请求参数
func validateCreateUserRequest(req *CreateUserRequest) error {
	if req == nil {
		return fmt.Errorf("请求参数不能为空")
	}
	if len(req.Username) < 3 || len(req.Username) > 20 {
		return fmt.Errorf("用户名长度必须在3-20个字符之间")
	}
	if len(req.Password) < 6 {
		return fmt.Errorf("密码长度不能少于6位")
	}
	// 邮箱格式验证
	if req.Email == "" {
		return fmt.Errorf("邮箱不能为空")
	}
	// 简单的邮箱格式检查
	if !strings.Contains(req.Email, "@") || !strings.Contains(req.Email, ".") {
		return fmt.Errorf("邮箱格式不正确")
	}
	return nil
}

// validateUpdateUserRequest 验证更新用户请求参数
func validateUpdateUserRequest(req *UpdateUserRequest) error {
	if req.Username != "" && (len(req.Username) < 3 || len(req.Username) > 20) {
		return fmt.Errorf("用户名长度必须在3-20个字符之间")
	}
	return nil
}
